package com.doraemon.service.impl;

import com.doraemon.context.BaseContext;
import com.doraemon.entity.AddressBook;
import com.doraemon.mapper.AddressBookMapper;
import com.doraemon.service.AddressBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 地址簿管理Service实现
 **/
// fixme 地址簿接口部分方法未进行多用户数据处理，单用户没问题，多用户可能有数据混乱
@Service
public class AddressBookServiceImpl implements AddressBookService {

    @Autowired
    private AddressBookMapper addressBookMapper;

    /***
     * 查看当前登录用户的所有地址信息
     * ---
     * @param
     * @return: com.doraemon.result.Result<java.util.List < com.doraemon.entity.AddressBook>>
     */
    @Override
    public List<AddressBook> getListAddressBook() {

        // 1.构建地址实体
        AddressBook addressBook = new AddressBook();

        // 2.设置当前操作的id
        addressBook.setId(BaseContext.getCurrentId());

        // 3.调用地址薄Mapper层，根据地址实体查询所有地址信息
        List<AddressBook> addressBooks = addressBookMapper.list(addressBook);

        return addressBooks;
    }

    /***
     * 新增地址
     * ---
     * @param addressBook 地址实体
     * @return: void
     */
    @Override
    public void addAddressBook(AddressBook addressBook) {

        // 1.设置当前操作的id(只能对当前用户添加地址)
        addressBook.setUserId(BaseContext.getCurrentId());

        // 2.设置非默认地址
        addressBook.setIsDefault(0);

        // 3.调用地址簿Mapper层，插入地址数据
        addressBookMapper.insert(addressBook);
    }

    /***
     * 查询默认地址
     * ---
     * @param
     * @return: com.doraemon.entity.AddressBook
     */
    @Override
    public AddressBook getDefaultAddressBook() {

        // 1.构建地址实体
        AddressBook addressBook = new AddressBook();

        // 2.设置当前操作的id（只能获取当前用户的默认地址）
        addressBook.setId(BaseContext.getCurrentId());

        // 3.设置默认地址的属性值
        addressBook.setIsDefault(1);

        // 4.调用地址簿Mapper层，获取地址实体信息
        List<AddressBook> addressBooks = addressBookMapper.list(addressBook);

        return addressBooks.get(0);
    }

    /***
     * 根据id查询地址
     * ---
     * @param id 地址id
     * @return: com.doraemon.result.Result<com.doraemon.entity.AddressBook>
     */
    @Override
    public AddressBook getAddressBookById(Long id) {

        // 1.调用地址薄Mapper层，查询地址实体
        AddressBook addressBook = addressBookMapper.getAddressBookById(id);

        return addressBook;
    }

    /***
     * 根据id删除地址
     * ---
     * @param id 地址id
     * @return: com.doraemon.result.Result
     */
    @Override
    public void deleteAddressBookById(Long id) {

        // 1.调用地址簿Mapper层，删除地址实体
        addressBookMapper.deleteById(id);
    }

    /***
     * 修改地址
     * ---
     * @param addressBook 地址实体
     * @return: com.doraemon.result.Result
     */
    @Override
    public void update(AddressBook addressBook) {

        // 1.调用地址簿Mapper层，修改地址实体
        addressBookMapper.update(addressBook);
    }

    /***
     * 设置默认地址
     * -由Spring事务管理-
     * ---
     * @param addressBook 地址实体
     * @return: com.doraemon.result.Result
     */
    @Transactional
    @Override
    public void setDefaultAddressBook(AddressBook addressBook) {

        // 1.将当前用户的所有地址重置为非默认
        addressBook.setIsDefault(0);
        addressBook.setUserId(BaseContext.getCurrentId());
        // 调用地址簿Mapper层，将用户id所属下的所有地址重置为非默认
        addressBookMapper.updateIsDefaultByUserId(addressBook);

        // 2.将当前地址改为默认
        addressBook.setIsDefault(1);

        // 3.调用地址簿Mapper层，修改为默认地址
        addressBookMapper.update(addressBook);
    }

}
